// server/boot/create-admin.js
'use strict';

const bcrypt = require('bcryptjs');

module.exports = async function (app) {
  const Role = app.models.Role;
  const RoleMapping = app.models.RoleMapping;
  const User = app.models.User;

  const username = '18586608025';
  const password = '12345678';
  // 这里写了这个方法，就会在数据库自动创建那两个表
  // 加密密码
  const hashedPassword = await bcrypt.hash(password, 10);

  // // 创建管理员用户
  // const [adminUser] = await User.findOrCreate(
  //   { where: { username } },
  //   {
  //     username,
  //     password: hashedPassword,
  //     phone: '18586608025'
  //   }
  // );
  // 创建管理员用户
  let adminUser = await User.findOne({ where: { username } });
  if (!adminUser) {
    adminUser = await User.create({
      username,
      password: hashedPassword,
      phone: '18586608025'
    });
  }
  // 创建 admin 角色然后这个文件夹里面是创建管理员，写了

  // 创建 admin 角色（容错写法）
  let adminRole = await Role.findOne({ where: { name: 'admin' } });
  if (!adminRole) {
    try {
      adminRole = await Role.create({ name: 'admin' });
    } catch (err) {
      // 如果并发场景下别的进程抢先建了，再兜底查一次
      if (err.statusCode === 422 && err.details?.codes?.name?.includes('uniqueness')) {
        adminRole = await Role.findOne({ where: { name: 'admin' } });
      } else {
        throw err;
      }
    }
  }

  // 分配角色
  await RoleMapping.findOrCreate(
    {
      where: {
        principalType: 'USER',
        principalId: adminUser.id,
        roleId: adminRole.id
      }
    },
    {
      principalType: 'USER',
      principalId: adminUser.id,
      roleId: adminRole.id
    }
  );

  console.log('✅ 管理员账号已初始化完成');
};
